package co.com.coomeva.adminEvaluacion.logica;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import co.com.coomeva.adminEvaluacion.modelo.entidades.EvaRoleCargo;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EvaRoleCargoId;
import co.com.coomeva.adminEvaluacion.modelo.persistencia.EvaRoleCargoDAO;
import co.com.coomeva.adminEvaluacion.modelo.util.DatabaseUtil;

public class EvaRoleCargoLogica {

	private static EvaRoleCargoLogica rolCargoLogica = null;
	
	//Objeto con el que se accede a la BD
	private EvaRoleCargoDAO rolCargoDAO = null;
	
	/**
	 * Constructor de la clase
	 */
	public EvaRoleCargoLogica() {
		rolCargoDAO = new EvaRoleCargoDAO();
	}
	
	/**
	 * Metodo que permite obtener una instancia de la clase
	 * @return Instancia de la clase
	 */
	public static EvaRoleCargoLogica getInstance()	{
		if(rolCargoLogica == null) {
			rolCargoLogica = new EvaRoleCargoLogica();
		}
		return rolCargoLogica;
	}	
		
	/**
	 * Metodo que permite consultar los roles segun el cargo seleccionado
	 * @param cargoCodigo Codigo del cargo
	 * @param roleCodigo Codigo del rol
	 * @param roleNombre Nombre del rol
	 * @return Lista del tipo EvaRoleCargo con los roles consultados
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public List<EvaRoleCargo> consultarRolesXCargo(Long cargoCodigo, Long roleCodigo,
			String roleNombre) throws Exception {

		Session session = rolCargoDAO.getSession();
		List<EvaRoleCargo> valorList = new ArrayList<EvaRoleCargo>();
		
		//System.out.println("cargoCodigo = " + cargoCodigo);
		
		try {
			Query qSelect = session.getNamedQuery("consulta_roles_x_cargo");
			String strSql = qSelect.getQueryString();
									
			String strCondicion = "";
			
			if (cargoCodigo != null && cargoCodigo.longValue() > 0){
				strCondicion += " cargo_codigo = " + cargoCodigo;
			}
			
			if (roleCodigo != null && roleCodigo.longValue() > 0){
				if(!strCondicion.equals(""))
					strCondicion += " AND";
				
				strCondicion += " role_codigo = " + roleCodigo;
			}
			
			if (roleNombre != null && !roleNombre.equals("")){
				if(!strCondicion.equals(""))
					strCondicion += " AND";
				
				strCondicion += " LOWER(role_nombre) LIKE LOWER('%" + roleNombre + "%')";
			}
			
			if(!strCondicion.equals(""))
				strCondicion = " WHERE" + strCondicion;
						
			strSql += strCondicion + " ORDER BY role_nombre";
			
			//System.out.println("strSql = " + strSql);
			List list = DatabaseUtil.ejecutarConsulta(session, strSql);
				
			EvaRoleCargo objTemp;
			EvaRoleCargoId objECargoId;
			for (Iterator iter = list.iterator(); iter.hasNext();) {
				Object[] obj = (Object[]) iter.next();
		
				objTemp = new EvaRoleCargo();
				objECargoId = new EvaRoleCargoId();
				objECargoId.setRoleCodigo(new Long(obj[0].toString()));
				objECargoId.setRoleNombre(obj[1].toString());	
				objTemp.setId(objECargoId);
				valorList.add(objTemp);
			}
		
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error consultando los registros");
		} finally {
			//session.clear();
			//session.close();
		}
		return valorList;
	}
}